package com.kk.demo.unsface.third;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

import com.kk.util.IOutils;

/**
 * MappedByteBuffer进行文件的读写操作
 * 
* 源文件名：MappedByteBufferTest.java
* 文件版本：1.0.0
* 创建作者：Think
* 创建日期：2016年12月4日
* 修改作者：Think
* 修改日期：2016年12月4日
* 文件描述：TODO
* 版权所有：Copyright 2016 zjhz, Inc. All Rights Reserved.
*/
public class MappedByteBufferReadWrite {

    public static void main(String[] args) {

        MappedByteBufferReadWrite mappRead = new MappedByteBufferReadWrite();

        // 写入两G数据
        mappRead.writeBigFile(1024);
    }

    public void writeBigFile(int maxSize) {
        long msize = 1 * 1024 * 1024;

        long itemSize = 256 * msize;

        long startTime = System.currentTimeMillis();

        File file = new File("D:/java/test/data.txt");
        // 分配一块内存大小
        MappedByteBuffer byteBuffer = null;
        RandomAccessFile randFile = null;
        FileChannel channel = null;
        try {
            randFile = new RandomAccessFile(file, "rw");
            channel = randFile.getChannel();

            // 首次申请256的内存空间
            byteBuffer = channel.map(MapMode.READ_WRITE, 0, itemSize).load();

            long mapNum = maxSize * msize / itemSize;

            long startSize = 0;

            // 控制写入次数
            for (int i = 0; i < mapNum; i++) {
                for (int j = 0; j < itemSize; j++) {
                    byteBuffer.put((byte) (i * j));
                }
                byteBuffer.force();
                byteBuffer.clear();
                startSize = i * itemSize;
                byteBuffer = channel.map(MapMode.READ_WRITE, startSize, startSize + itemSize).load();

            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOutils.closeQuietly(channel);
            IOutils.closeQuietly(randFile);
        }

        long endTIme = System.currentTimeMillis();

        System.out.println("用时:" + (endTIme - startTime) / 1000.0f);
    }

}
